import { Inject, Injectable } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
import { FindUserDto } from './dto/find-user.dto';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { UserVo } from './vo/user.vo';

@Injectable()
export class UserService {
  @Inject('PRISMA')
  private readonly prismaClient: PrismaClient; // 注入 prisma client

  async create(createUserDto: CreateUserDto) {
    /**
     * ORM 新增：调用 prisma client 生成的 user 对象中 create 方法
     */
    const record = await this.prismaClient.user.create({
      // 前端提交的参数直接存入数据库
      data: createUserDto,
    });
    /**
     * SQL 新增
     */
    // await this.prismaClient.$executeRaw`
    //   INSERT INTO user (name, age, money, email, create_time, update_time) VALUES ('姓名', 30, 233.33, 'Neil38@xxx.org', NOW(), NOW())
    // `;
    return new UserVo(record);
  }

  async findAll(findUserDto: FindUserDto) {
    // 计算分页
    const current = Number(findUserDto.current); // 页码
    const take = Number(findUserDto.size); // 一页数据量
    const skip = (current - 1) * take; // 偏移数据量
    /**
     * ORM 查询分页列表：调用 prisma client 生成的 user 对象中 findMany + count 方法
     */
    const where = {
      name: {
        startsWith: findUserDto.name,
      },
      age: Number(findUserDto.age),
    };
    const [records, total] = await Promise.all([
      this.prismaClient.user.findMany({
        // 指定 WHERE 过滤条件：
        where,
        // 指定排序：根据 createTime 倒序
        orderBy: { createTime: 'desc' },
        // 获取数据量
        take,
        // 偏移数据量
        skip,
      }),
      this.prismaClient.user.count({ where }),
    ]);
    /**
     * SQL 查询分页列表
     */
    // const records = await this.prismaClient.$queryRaw`
    //   SELECT * FROM user WHERE user.name LIKE '姓名_M%' AND user.age=30 ORDER BY user.create_time DESC LIMIT 10 OFFSET 0
    // `;
    // const total = await this.prismaClient.$queryRaw`
    //   SELECT COUNT(*) count FROM user WHERE user.name LIKE '姓名_M%' AND user.age=30
    // `;
    return {
      current,
      size: take,
      total,
      // 查询记录转换为 UserVo 后返回
      records: records.map((item) => new UserVo(item)),
    };
  }

  async findOne(id: number) {
    /**
     * ORM 查询详情：调用 prisma client 生成的 user 对象中 findUnique 方法
     */
    const record = await this.prismaClient.user.findUnique({
      // 指定 WHERE 过滤条件：根据主键 id 查询数据
      where: { id },
    });
    /**
     * SQL 查询详情
     */
    // const records = await this.prismaClient.$queryRaw`
    //   SELECT * FROM user WHERE user.id=3
    // `;
    return new UserVo(record);
  }

  async update(id: number, updateUserDto: UpdateUserDto) {
    /**
     * ORM 修改：调用 prisma client 生成的 user 对象中 update 方法
     */
    const record = await this.prismaClient.user.update({
      // 前端提交的参数直接存入数据库
      data: updateUserDto,
      // 指定 WHERE 过滤条件：根据主键 id 修改数据
      where: { id },
    });
    /**
     * SQL 修改
     */
    // await this.prismaClient.$executeRaw`
    //   UPDATE user SET name='修改姓名', age=18, money=322.22, email='修改邮箱' WHERE user.id=3
    // `;
    return new UserVo(record);
  }

  async remove(id: number) {
    /**
     * ORM 删除：调用 prisma client 生成的 user 对象中 delete 方法
     */
    const record = await this.prismaClient.user.delete({
      // 指定 WHERE 过滤条件：根据主键 id 删除数据
      where: { id },
    });
    /**
     * SQL 删除
     */
    // await this.prismaClient.$executeRaw`
    //   DELETE FROM user WHERE user.id = 2
    // `;
    return new UserVo(record);
  }
}
